// 处理数据库
const {
	dbQuery
} = require('../db/index');
// 处理验证
const joi = require('joi');
// 处理响应
const {
	sendError,
	sendSuccess
} = require('../tools/sendFunction.js');

// 设定验证规则
var guiZe = joi.object({
	name: joi.string().required().error(new Error('name不符合验证规则')),
	alias: joi.string().required().alphanum().error(new Error('alias不符合验证规则'))
})

var guiZe2 = joi.object({
	id: joi.number().required().min(1).error(new Error('id不符合验证规则')),
})

exports.getArticleCates = async (req, res) => {
	try {
		var result = await dbQuery('select id,name,alias from article_cate where is_delete=0 order by id')
	} catch (error) {
		next(error);
		return;
	}
	if (result.length >= 0) {
		sendSuccess(res, '获取文章分类列表成功!', {
			data: result
		})
	} else {
		sendError(res, 200, '获取文章分类列表失败!')
	}
}

exports.addArticleCates = async (req, res, next) => {
	let {
		name,
		alias
	} = req.body;

	// 验证请求参数
	try {
		await guiZe.validateAsync({
			name: name,
			alias: alias
		})
	} catch (error) {
		next(error);
		return;
	}

	// 请求参数验证通过
	// 是否被占用
	try {
		var result = await dbQuery('select * from article_cate where name=? or alias=?', [name, alias])
	} catch (error) {
		next(error)
		return;
	}
	// 被占用
	if (result.length == 1 && result[0].name == name) {
		sendError(res, 200, '分类名称被占用，请更换后重试!');
		return
	} else if (result.length == 1 && result[0].alias == alias) {
		sendError(res, 200, '分类别名被占用，请更换后重试!');
		return
	}

	// 不被占用
	// 插入
	try {
		var result2 = await dbQuery('insert into article_cate (name,alias) values (?,?)', [name, alias])
	} catch (error) {
		next(error);
		return;
	}

	if (result2.affectedRows !== 1) {
		sendError(res, 200, '新增文章分类失败!');
	} else {
		sendSuccess(res, '新增文章分类成功!');
	}
}

exports.deleteArticleCateById = async (req, res, next) => {
	let id = req.params.id;
	// 验证请求参数
	try {
		await guiZe2.validateAsync({
			id: id
		})
	} catch (error) {
		next(error)
		return
	}

	// 请求参数验证通过
	// 更新
	try {
		var result = await dbQuery('update article_cate set is_delete=1 where id = ?', [id])
	} catch (error) {
		next(error)
		return
	}
	if (result.affectedRows !== 1) {
		sendError(res, 200, '删除文章分类失败!');
	} else {
		sendSuccess(res, '删除文章分类成功!');
	}
}

exports.getArticleCateById = async (req, res, next) => {
	let id = req.params.id

	// 验证请求参数
	try {
		await guiZe2.validateAsync({
			id: id
		})
	} catch (error) {
		next(error)
		return
	}

	// 请求参数验证通过
	// 查询
	try {
		var result = await dbQuery('select * from article_cate where id=?', [id])
	} catch (error) {
		next(error)
		return
	}
	if (result.length !== 1) {
		sendError(res, 200, '获取文章分类数据失败!')
	} else {
		sendSuccess(res, '获取文章分类数据成功!', {
			data: result[0]
		})
	}
}

exports.updateArticleCateById = async (req, res, next) => {
	let {
		id,
		name,
		alias
	} = req.body;

	// 验证请求参数
	try {
		await guiZe2.validateAsync({
			id: id
		})
		await guiZe.validateAsync({
			name: name,
			alias: alias
		})
	} catch (error) {
		next(error);
		return;
	}

	// 请求参数验证通过
	// 是否被占用
	try {
		var result = await dbQuery('select * from article_cate where id!=? and (name=? or alias=?)', [id, name, alias])
	} catch (error) {
		next(error);
		return;
	}
	// 被占用
	if (result.length >= 2) {
		sendError(res, 200, '分类名称和分类别名被占用，请更换后重试!')
		return;
	} else if (result.length === 1 && result[0].name === name) {
		sendError(res, 200, '分类名称被占用，请更换后重试!')
		return;
	} else if (result.length === 1 && result[0].alias === alias) {
		sendError(res, 200, '分类别名被占用，请更换后重试!')
		return;
	}

	// 不被占用
	// 更新
	try {
		var result2 = await dbQuery('update article_cate set name=?,alias=? where id=?', [name, alias, id])
	} catch (error) {
		next(error);
		return;
	}

	if (result2.affectedRows !== 1) {
		sendError(res, 200, '更新文章分类失败!')
	} else {
		sendSuccess(res, '更新文章分类成功!');
	}
}